home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / CPP / WFC010.ZIP / SRC / TALKSOCK.CPP < prev    next >
C/C++ Source or Header  |  1995-12-07  |  4KB  |  176 lines

  1. #include <wfc.h>
  2. #pragma hdrstop
  3.  
  4. /*
  5. ** Author: Samuel R. Blackburn
  6. ** CI$: 76300,326
  7. ** Internet: sammy@sed.csc.com
  8. **
  9. ** You can use it any way you like as long as you don't try to sell it.
  10. **
  11. ** Any attempt to sell WFC in source code form must have the permission
  12. ** of the original author. You can produce commercial executables with
  13. ** WFC but you can't sell WFC.
  14. **
  15. ** Copyright, 1995, Samuel R. Blackburn
  16. **
  17. ** $Workfile: $
  18. ** $Revision: $
  19. ** $Modtime: $
  20. */
  21.  
  22. #if defined( _DEBUG )
  23. #undef THIS_FILE
  24. static char BASED_CODE THIS_FILE[] = __FILE__;
  25. #define new DEBUG_NEW
  26. #endif
  27.  
  28. CTalkingSocket::CTalkingSocket()
  29. {
  30.    m_Initialize();
  31. }
  32.  
  33. CTalkingSocket::CTalkingSocket( const CString& a_host_name, const CString& p_name )
  34. {
  35.    m_Initialize();
  36.  
  37.    SetAddress( a_host_name );
  38.    SetPort( p_name );
  39. }
  40.  
  41. CTalkingSocket::CTalkingSocket( const CString& address, const short p_number )
  42. {
  43.    m_Initialize();
  44.  
  45.    SetAddress( address );
  46.    SetPort( p_number );
  47. }
  48.  
  49. CTalkingSocket::~CTalkingSocket()
  50. {
  51.    TRACE( "Destroying a TALKING_SOCKET object\n" );
  52. }
  53.  
  54. #if defined( _DEBUG )
  55.  
  56. void CTalkingSocket::Dump( CDumpContext &dump_context ) const
  57. {
  58.    CSimpleSocket::Dump( dump_context );
  59. }
  60.  
  61. #endif // _DEBUG
  62.  
  63. void CTalkingSocket::m_Initialize( void )
  64. {
  65.    ASSERT_VALID( this );
  66.  
  67.    TRACE( "Initializing a TALKING_SOCKET object\n" );
  68. }
  69.  
  70. /*
  71. ** The Socket manipulation routines
  72. */
  73.  
  74. BOOL CTalkingSocket::Open( void )
  75. {
  76.    ASSERT_VALID( this );
  77.  
  78.    if ( Address.IsEmpty() )
  79.    {
  80.       /*
  81.       ** We don't have an address
  82.       */
  83.  
  84.       return( FALSE );
  85.    }
  86.  
  87.    SOCKADDR_IN server_address;
  88.  
  89.    /*
  90.    ** Create the socket
  91.    */
  92.  
  93.    m_SocketID = ::socket( AF_INET, SOCK_STREAM, 0 );
  94.  
  95.    if ( m_SocketID == INVALID_SOCKET )
  96.    {
  97.       return( FALSE );
  98.    }
  99.  
  100.    /*
  101.    ** Now fill in a socket address structure with the necessary information about the remote
  102.    ** server node (remote node IP address and port for incoming connections) and attempt to
  103.    ** connect to the server. This connect call will block until the remote server has accepted
  104.    ** the connection or the connection request times out.
  105.    */
  106.  
  107.    server_address.sin_family      = AF_INET;
  108.    server_address.sin_port        = m_PortNumberInNetworkByteOrder;
  109.    server_address.sin_addr.s_addr = ::inet_addr( (const char *) Address );
  110.  
  111.    int connection_status = 0;
  112.  
  113.    connection_status = ::connect( m_SocketID, (LPSOCKADDR) &server_address, sizeof( server_address ) );
  114.  
  115.    if ( connection_status == SOCKET_ERROR )
  116.    {
  117.       m_ErrorCode = ::WSAGetLastError();
  118.  
  119.       TRACE( "CTalkingSocket::Open(), connect failed at line %d of %s error #%d, address = %s, port number %d\n",
  120.              __LINE__, 
  121.              __FILE__,
  122.              m_ErrorCode,
  123.              (const char *) Address,
  124.              ::ntohs( m_PortNumberInNetworkByteOrder ) );
  125.  
  126.       Close();
  127.       return( FALSE );
  128.    }
  129.  
  130.    m_hFile = (UINT) m_SocketID;
  131.     
  132.    return( TRUE );
  133. }
  134.  
  135. #pragma warning( disable : 4100 )
  136.  
  137. BOOL CTalkingSocket::Open( const char * a, UINT port_number, CFileException *perror )
  138. {
  139.    ASSERT_VALID( this );
  140.    ASSERT( a != NULL );
  141.  
  142.    if ( a == NULL )
  143.    {
  144.       m_ErrorCode = ERROR_INVALID_PARAMETER;
  145.       return( FALSE );
  146.    }
  147.  
  148.    SetAddress( a );
  149.    SetPort( (short) port_number );
  150.  
  151.    return( Open() );
  152. }
  153.  
  154. #pragma warning( default : 4100 )
  155.  
  156. BOOL CTalkingSocket::Open( const CString& a, const short p )
  157. {
  158.    ASSERT_VALID( this );
  159.    ASSERT( p > 0 );
  160.  
  161.    SetAddress( a );
  162.    SetPort( p );
  163.  
  164.    return( Open() );
  165. }
  166.  
  167. BOOL CTalkingSocket::Open( const CString& _host_name, const CString& _port_name )
  168. {
  169.    ASSERT_VALID( this );
  170.  
  171.    SetAddress( _host_name );
  172.    SetPort( _port_name );
  173.  
  174.    return( Open() );
  175. }
  176.